{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 随机森林与决策树对比实验报告"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 实验概述\n",
    "\n",
    "本实验对比了三种模型在葡萄酒数据集上的表现：\n",
    "1. 自主实现的随机森林(My RF)\n",
    "2. Sklearn实现的随机森林(Sklearn RF)\n",
    "3. 单棵决策树(Decision Tree)\n",
    "\n",
    "实验内容包括：\n",
    "- 自主实现随机森林算法\n",
    "- 模型训练与评估\n",
    "- 可视化对比分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "特征数: 13, 类别数: 3\n",
      "训练集样本数: 124, 测试集样本数: 54\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.datasets import load_wine\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 加载数据集\n",
    "wine = load_wine()\n",
    "X, y = wine.data, wine.target\n",
    "feature_names = wine.feature_names\n",
    "class_names = wine.target_names\n",
    "\n",
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
    "\n",
    "print(f\"特征数: {X.shape[1]}, 类别数: {len(class_names)}\")\n",
    "print(f\"训练集样本数: {len(X_train)}, 测试集样本数: {len(X_test)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 自主实现随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class MyRandomForest:\n",
    "    def __init__(self, n_estimators=100, max_depth=None, max_features='sqrt', random_state=None):\n",
    "        self.n_estimators = n_estimators\n",
    "        self.max_depth = max_depth\n",
    "        self.max_features = max_features\n",
    "        self.random_state = random_state\n",
    "        self.trees = []\n",
    "        self.feature_importances_ = None\n",
    "        np.random.seed(random_state)\n",
    "        \n",
    "    def fit(self, X, y):\n",
    "        n_samples, n_features = X.shape\n",
    "        self.feature_importances_ = np.zeros(n_features)\n",
    "        \n",
    "        # 确定每个树使用的特征数\n",
    "        if self.max_features == 'sqrt':\n",
    "            max_features = int(np.sqrt(n_features))\n",
    "        else:\n",
    "            max_features = n_features\n",
    "            \n",
    "        for _ in range(self.n_estimators):\n",
    "            # 自助采样\n",
    "            indices = np.random.choice(n_samples, n_samples, replace=True)\n",
    "            X_sample = X[indices]\n",
    "            y_sample = y[indices]\n",
    "            \n",
    "            # 特征采样\n",
    "            feature_indices = np.random.choice(n_features, max_features, replace=False)\n",
    "            X_sample = X_sample[:, feature_indices]\n",
    "            \n",
    "            # 训练决策树\n",
    "            tree = DecisionTreeClassifier(max_depth=self.max_depth)\n",
    "            tree.fit(X_sample, y_sample)\n",
    "            self.trees.append((tree, feature_indices))\n",
    "            \n",
    "            # 累计特征重要性\n",
    "            for i, idx in enumerate(feature_indices):\n",
    "                self.feature_importances_[idx] += tree.feature_importances_[i]\n",
    "                \n",
    "        # 归一化特征重要性\n",
    "        self.feature_importances_ /= np.sum(self.feature_importances_)\n",
    "    \n",
    "    def predict(self, X):\n",
    "        predictions = np.zeros((len(self.trees), len(X)))\n",
    "        for i, (tree, feature_indices) in enumerate(self.trees):\n",
    "            predictions[i] = tree.predict(X[:, feature_indices])\n",
    "        return np.array([np.bincount(predictions[:, i].astype(int)).argmax() for i in range(len(X))])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 模型训练与评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练完成！\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# 训练三种模型\n",
    "my_rf = MyRandomForest(n_estimators=100, max_depth=3, random_state=42)\n",
    "my_rf.fit(X_train, y_train)\n",
    "my_rf_pred = my_rf.predict(X_test)\n",
    "my_rf_acc = accuracy_score(y_test, my_rf_pred)\n",
    "\n",
    "sklearn_rf = RandomForestClassifier(n_estimators=100, max_depth=3, random_state=42)\n",
    "sklearn_rf.fit(X_train, y_train)\n",
    "sklearn_rf_pred = sklearn_rf.predict(X_test)\n",
    "sklearn_rf_acc = accuracy_score(y_test, sklearn_rf_pred)\n",
    "\n",
    "dt = DecisionTreeClassifier(max_depth=3, random_state=42)\n",
    "dt.fit(X_train, y_train)\n",
    "dt_pred = dt.predict(X_test)\n",
    "dt_acc = accuracy_score(y_test, dt_pred)\n",
    "\n",
    "print(\"训练完成！\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 可视化分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAHqCAYAAADVi/1VAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADKjklEQVR4nOzdd1hT5/s/8HfYe4kMFRlOEEEBB1i1DlBEFLfSKohoFa0DtXXUvTeO4hZcVerChQP3bhVFUfy4EatBHBXUKvP8/vBHvsYEDQoJ4vt1Xedq8+Q559wnOZInd54hEgRBABERERERERERkRKpqToAIiIiIiIiIiL69jApRURERERERERESsekFBERERERERERKR2TUkREREREREREpHRMShERERERERERkdIxKUVERERERERERErHpBQRERERERERESkdk1JERERERERERKR0TEoREREREREREZHSMSlFVAyio6MhEokgEolw7NgxmecFQUDVqlUhEonw/fffF+u5RSIRJk6cWOT9UlJSIBKJEB0drfA+SUlJEIlE0NTUhFgsLvI5v3VZWVlYsmQJvvvuO5iamkJLSwsVK1ZE165dcfz4cVWHV+I+554jIqLS4f22zofbiBEjSuScycnJmDhxIlJSUkrk+F+i4DNt7ty5qg7ls505cwYTJ07EixcvVB1Ksbpy5Qp69+4Ne3t76OjowMDAAG5ubpg9ezaeP3+u6vBKXHBwMOzs7FQdBpHCmJQiKkaGhoZYvXq1TPnx48dx584dGBoaqiCq4rNq1SoAQG5uLtatW6fiaL4uT58+RaNGjRAeHg5nZ2dER0fj8OHDmDdvHtTV1dGiRQtcvnxZ1WGWKGtra5w9exZ+fn6qDoWIiD5TVFQUzp49K7UNHjy4RM6VnJyMSZMmlcqkVFlw5swZTJo0qUwlpVauXAl3d3ecP38eI0eOxP79+7Fjxw506dIFy5YtQ58+fVQdYokbN24cduzYoeowiBSmoeoAiMqSbt26YePGjfj9999hZGQkKV+9ejU8PT2RmZmpwui+TFZWFjZu3AhXV1c8ffoUa9aswa+//qrqsOR68+YNdHR0IBKJVB2KRK9evXD58mUcOHAAzZs3l3que/fuCA8Ph6mpqYqiK1l5eXnIzc2FtrY2GjZsqOpwiIjoCzg7O8PDw0PVYXyRnJwciEQiaGh8m1+F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p6cnSUgBgLW1NdLT0z95nTExMahZsyZu3ryJoUOHYtmyZTAzM5OqY2hoiIsXL0oeq6lx8AQREakGk1JERERE9E3Q0dGBt7c3vL29MX78eISGhmLChAlSSSlvb29s2rQJBw4cwA8//FDosfLz82FtbY1jx47JPGdiYgIAGDlyJA4cOIC5c+eiatWq0NXVRefOnZGdnS1VX19fX+YYHw65E4lEEAThk9doY2ODatWqoVq1ajAwMECnTp2QnJwMCwsLSR01NTVUrVr1k8ciIiIqaUxKEREREdE3ycnJCbGxsVJl7dq1g7+/PwIDA6Guro7u3bvL3dfNzQ1paWnQ0NCAnZ2d3DonT55EcHAwOnToAODdHFMpKSnFeAUf17RpUzg7O2PatGlYuHCh0s5LRESkKPbVJSIiIqIy7dmzZ2jevDk2bNiAK1eu4N69e9iyZQtmz56N9u3by9Tv0KED1q9fj969e2Pr1q1yj9myZUt4enoiICAABw4cQEpKCs6cOYPffvsNFy5cAABUrVoV27dvR2JiIi5fvozAwEDk5+eX6LV+aPjw4Vi+fDkePnyo1PMSEREpgj2liIiIiKhMMzAwQIMGDbBgwQLcuXMHOTk5sLGxQd++fTFmzBi5+3Tu3Bn5+fno2bMn1NTU0LFjR6nnRSIR4uLiMHbsWISEhODJkyewsrJCkyZNYGlpCQBYsGABQkJC4OXlBXNzc/z666/IzMws8et9X9u2bWFnZ4dp06YhMjJSqecmIiL6FJGgyOD0MiQzMxPGxsbIyMiAkZFRiZ3HbtTeEjs2lR0pM/1UHcI7E41VHQF9DSZmqDoCidpra6s6BPoKJAUlldixldWeUJWPXd/bt29x79492NvbQ0dHR0UR0teG9823QZHP55L820zFg+8jFQdF20ocvkdERERERERERErHpBQRERERERERESkdk1JERERERERERKR0TEoREREREREREZHSMSlFRERERERERERKx6QUEREREREREREpHZNSRERERERERESkdExKERERERERERGR0jEpRURERERERERESsekFBERERFRMbKzs0NERESx1yUiIiprNFQdABERERF9/Wqvra3U8yUFJRWpfnBwMNauXQsA0NDQgJmZGVxcXNCjRw8EBwdDTa34fqs9f/489PX1i73u53j/ugsjCEKJnZ+IiOhjVN5TKjIy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SISEhHCicyIiIiIiIiKir0iRV99r1aqV5P8dHByQnJyM58+fw9TUtNC5oArTrVs3PHv2DJMnT4ZYLIazszPi4uJga2sLABCLxUhNTZXUNzAwQHx8PH7++Wd4eHigXLly6Nq1K6ZOnVrUyyAiIiIiIiIiIhUqUlIqNzcXOjo6SExMhLOzs6TczMzsswMICwtDWFiY3Oeio6NlymrWrCkz5I+IiIiIiIiIiL4uRRq+p6GhAVtbW+Tl5ZVUPERERERERERE9A34rDmlRo8ejefPn5dEPERERERERERE9A0o8pxSixYtwu3bt1GhQgXY2tpCX19f6vmLFy8WW3BERERERERERFQ2FTkpFRAQUAJhEBERERERERHRt6TISakJEyaURBxERERERERERPQNKfKcUkRERERERERERF+qyD2l1NTUIBKJCn2eK/MREREREREREdGnFDkptWPHDqnHOTk5uHTpEtauXYtJkyYVW2BERERERERERFR2FTkp1b59e5myzp07o1atWoiJiUGfPn2KJTAiIiIiIiIiIiq7im1OqQYNGuDQoUPFdTgiIiIiIiIiIirDiiUp9ebNGyxevBiVKlUqjsMREREREREREVEZV+SklKmpKczMzCSbqakpDA0NsWbNGsyZM6ckYiQiIiL6pkVGRsLe3h46Ojpwd3fHyZMnC627fft2eHt7o3z58jAyMoKnpycOHDigxGiJiIiIFFPkOaUWLFggtfqempoaypcvjwYNGsDU1LRYgyMiIiL61sXExGDo0KGIjIxEo0aNsHz5cvj6+iI5ORmVK1eWqX/ixAl4e3tj+vTpMDExQVRUFPz9/fHXX3+hbt26KrgCIiIiIvmKnJQKDg4ugTCIiIiISJ758+ejT58+CA0NBQBERETgwIEDWLp0KWbMmCFTPyIiQurx9OnTsXPnTuzevZtJKSIiIipVijx8LyoqClu2bJEp37JlC9auXVssQRERERERkJ2djYSEBPj4+EiV+/j44MyZMwodIz8/Hy9fvoSZmVmhdbKyspCZmSm1EREREZW0IielZs6cCXNzc5lyCwsLTJ8+vViCIiIiIiLg6dOnyMvLg6WlpVS5paUl0tLSFDrGvHnz8Pr1a3Tt2rXQOjNmzICxsbFks7Gx+aK4iYiIiBRR5KTU/fv3YW9vL1Nua2uL1NTUYgmKiIiIiP7P+/N5AoAgCDJl8mzatAkTJ05ETEwMLCwsCq03evRoZGRkSLYHDx58ccxEREREn1LkOaUsLCxw5coV2NnZSZVfvnwZ5cqVK664iIiIiL555ubmUFdXl+kVlZ6eLtN76kMxMTHo06cPtmzZgpYtW360rra2NrS1tb84XiIiIqKiKHJPqe7du2Pw4ME4evQo8vLykJeXhyNHjmDIkCHo3r17ScRIRERE9E3S0tKCu7s74uPjpcrj4+Ph5eVV6H6bNm1CcHAw/vjjD/j5+ZV0mERERESfpcg9paZOnYr79++jRYsW0NB4t3t+fj569erFOaWIiIiIill4eDh69uwJDw8PeHp6YsWKFUhNTUX//v0BvBt69/DhQ6xbtw7Au4RUr169sHDhQjRs2FDSy0pXVxfGxsYquw4iIiKiDxU5KaWlpYWYmBhMnToViYmJ0NXVRe3atWFra1sS8RERERF907p164Znz55h8uTJEIvFcHZ2RlxcnKTtJRaLpeb1XL58OXJzczFw4EAMHDhQUh4UFITo6Ghlh09ERERUqCInpQpUq1YN1apVK85YiIiIiEiOsLAwhIWFyX3uw0TTsWPHSj4gIiIiomJQ5DmlOnfujJkzZ8qUz5kzB126dCmWoIiIiIiIiIiIqGwrclLq+PHjcifMbN26NU6cOFEsQRERERERERERUdlW5KTUq1evoKWlJVOuqamJzMzMYgmKiIiIiIiIiIjKtiInpZydnRETEyNTvnnzZjg5ORVLUEREREREREREVLYVeaLzcePGoVOnTrhz5w6aN28OADh8+DD++OMPbN26tdgDJCIiIiIiIiIqy+xG7VWoXspM2emUvmZFTkq1a9cOsbGxmD59OrZu3QpdXV24urriyJEjMDIyKokYiYiIiIiIiOhLTDRWrJ595ZKNg+g9RU5KAYCfn59ksvMXL15g48aNGDp0KC5fvoy8vLxiDZCIiIiIiIiIiMqeIs8pVeDIkSP48ccfUaFCBSxZsgRt2rTBhQsXijM2IiIiIiIiIiIqo4rUU+qff/5BdHQ01qxZg9evX6Nr167IycnBtm3bPnuS88jISMyZMwdisRi1atVCREQEGjdu/Mn9Tp8+jaZNm8LZ2RmJiYmfdW4iIiIiIiJSgCJDvzjsi4iKSOGeUm3atIGTkxOSk5OxePFiPHr0CIsXL/6ik8fExGDo0KEYO3YsLl26hMaNG8PX1xepqakf3S8jIwO9evVCixYtvuj8RERERERERESkGgonpQ4ePIjQ0FBMmjQJfn5+UFdX/+KTz58/H3369EFoaCgcHR0REREBGxsbLF269KP7/fTTTwgMDISnp+cXx0BERERERERERMqncFLq5MmTePnyJTw8PNCgQQMsWbIET548+ewTZ2dnIyEhAT4+PlLlPj4+OHPmTKH7RUVF4c6dO5gwYYJC58nKykJmZqbURkREREREREREqqVwUsrT0xMrV66EWCzGTz/9hM2bN6NixYrIz89HfHw8Xr58WaQTP336FHl5ebC0tJQqt7S0RFpamtx9bt26hVGjRmHjxo3Q0FBsOqwZM2bA2NhYstnY2BQpTiIiIiIiIiIiKn5FXn1PT08PISEhOHXqFJKSkjB8+HDMnDkTFhYWaNeuXZEDEIlEUo8FQZApA4C8vDwEBgZi0qRJqF69usLHHz16NDIyMiTbgwcPihwjEREREREREREVryInpd5Xo0YNzJ49G//88w82bdpUpH3Nzc2hrq4u0ysqPT1dpvcUALx8+RIXLlzAoEGDoKGhAQ0NDUyePBmXL1+GhoYGjhw5Ivc82traMDIyktqIiIiIiIiIiEi1vigpVUBdXR0BAQHYtWuXwvtoaWnB3d0d8fHxUuXx8fHw8vKSqW9kZISkpCQkJiZKtv79+6NGjRpITExEgwYNvvg6iIiIiIiIiIhIORSbmKmEhIeHo2fPnvDw8ICnpydWrFiB1NRU9O/fH8C7oXcPHz7EunXroKamBmdnZ6n9LSwsoKOjI1NORERERERERESlm0qTUt26dcOzZ88wefJkiMViODs7Iy4uDra2tgAAsViM1NRUVYZIREREREREREQlQKVJKQAICwtDWFiY3Oeio6M/uu/EiRMxceLE4g+KiIiIiIiIiIhKVLHMKUVERERERERERFQUTEoREREREREREZHSqXz4HhERERERERF9PrtRez9ZJ0VHCYEQFRF7ShERERERERERkdKxpxQRERERlU4TjRWsl1GycRAREVGJYE8pIiIiIiIiIiJSOialiIiIiIiIiIhI6Th8j4iIiIiIiIjoa6DI0PavaFg7e0oREREREREREZHSsacUEREREREREVEZUXttbYXqJQUllXAkn8aeUkREREREREREpHRMShERERERERERkdIxKUVERERERERERErHpBQRERERERERESkdk1JERERERERERKR0TEoREREREREREZHSaag6ACIiIiIiIlINu1F7FaqXolPCgRDRN4k9pYiIiIiIiIiISOmYlCIiIiIiIiIiIqVjUoqIiIiIiIiIiJSOSSkiIiKiUi4yMhL29vbQ0dGBu7s7Tp48WWhdsViMwMBA1KhRA2pqahg6dKjyAiUiIiIqAialiIiIiEqxmJgYDB06FGPHjsWlS5fQuHFj+Pr6IjU1VW79rKwslC9fHmPHjoWrq6uSoyUiIiJSHJNSRERERKXY/Pnz0adPH4SGhsLR0RERERGwsbHB0qVL5da3s7PDwoUL0atXLxgbGys5WiIiIiLFMSlFREREVEplZ2cjISEBPj4+UuU+Pj44c+aMiqIiIiIiKh4aqg6AiIiIiOR7+vQp8vLyYGlpKVVuaWmJtLS0YjtPVlYWsrKyJI8zMzOL7dhEREREhWFPKSIiIqJSTiQSST0WBEGm7EvMmDEDxsbGks3GxqbYjk1ERERUGCaliIiIiEopc3NzqKury/SKSk9Pl+k99SVGjx6NjIwMyfbgwYNiOzYRERFRYZiUIiIiIiqltLS04O7ujvj4eKny+Ph4eHl5Fdt5tLW1YWRkJLURERERlTTOKUVERERUioWHh6Nnz57w8PCAp6cnVqxYgdTUVPTv3x/Au15ODx8+xLp16yT7JCYmAgBevXqFJ0+eIDExEVpaWnByclLFJRARALtRexWqlzLTr4QjISplJiq4UuzEjJKNg1SCSSkiIiKiUqxbt2549uwZJk+eDLFYDGdnZ8TFxcHW1hYAIBaLkZqaKrVP3bp1Jf+fkJCAP/74A7a2tkhJSVFm6EREREQfpfKkVGRkJObMmQOxWIxatWohIiICjRs3llt3+/btWLp0KRITE5GVlYVatWph4sSJaNWqlZKjJiIiIlKesLAwhIWFyX0uOjpapkwQhBKOiIiIqIxTpAcXe299MZXOKRUTE4OhQ4di7NixuHTpEho3bgxfX1+ZX/sKnDhxAt7e3oiLi0NCQgKaNWsGf39/XLp0ScmRExERERERERHRl1BpT6n58+ejT58+CA0NBQBERETgwIEDWLp0KWbMmCFTPyIiQurx9OnTsXPnTuzevVuqmzoRERERERERkTyKzPGWoqOEQEh1PaWys7ORkJAAHx8fqXIfHx+cOXNGoWPk5+fj5cuXMDMzK7ROVlYWMjMzpTYiIiIiIiIiIlItlSWlnj59iry8PFhaWkqVW1paIi0tTaFjzJs3D69fv0bXrl0LrTNjxgwYGxtLNhsbmy+Km4iIiIiIiIiIvpxK55QCAJFIJPVYEASZMnk2bdqEiRMnIiYmBhYWFoXWGz16NDIyMiTbgwcPvjhmIiIiIiIiIiL6MiqbU8rc3Bzq6uoyvaLS09Nlek99KCYmBn369MGWLVvQsmXLj9bV1taGtrb2F8dLRERERERERETFR2U9pbS0tODu7o74+Hip8vj4eHh5eRW636ZNmxAcHIw//vgDfn5+JR0mERERERERERGVAJWuvhceHo6ePXvCw8MDnp6eWLFiBVJTU9G/f38A74bePXz4EOvWrQPwLiHVq1cvLFy4EA0bNpT0stLV1YWxsbHKroOIiIiIiIiIiIpGpUmpbt264dmzZ5g8eTLEYjGcnZ0RFxcHW1tbAIBYLEZqaqqk/vLly5Gbm4uBAwdi4MCBkvKgoCBER0crO3wiIiIi+kxcjpuIiIhUmpQCgLCwMISFhcl97sNE07Fjx0o+ICIiIiIiIiIiKnEqT0oREREREdHXR5HebgCQMpPzwBIRkXwqm+iciIiIiIiIiIi+XewpRURERET0/yk01xV7/hARERUL9pQiIiIiIiIiIiKlY1KKiIiIiIiIiIiUjsP3iIiIiIiISouJxgrUySj5OIiIlIA9pYiIiIiIiIiISOmYlCIiIiIiIiIiIqXj8D0iIiIiIiIiBXCFTqLixZ5SRERERERERESkdExKERERERERERGR0nH4HhEREREREREVO4WGO+ooIRAqtdhTioiIiIiIiIiIlI5JKSIiIiIiIiIiUjompYiIiIiIiIiISOmYlCIiIiIiIiIiIqXjROdERERERERExWWisYL1Mko2DqKvAHtKERERERERERGR0rGnFBERERFRUbAXRNmgyPvI95CIqEQxKUVEREREVMrZjdr7yTopM/2UEEnpp8hrBQApOiUcCBERfRKH7xERERERERERkdKxpxQREREREZUcDpMjIqJCMClFRERERPSNqL22tkL1koKSSjgSIiIiJqWIiIiIiIiolOE8akTfBs4pRURERERERERESsekFBERERERERERKR2TUkREREREREREpHRMShERERERERERkdIxKUVERERERERE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Z2dnAMDZs2dRUFDwUsUrqho7pYiIiIiIiIiIXhAcHIz8/HxERERAW1sbAFBWVoaxY8fCyMgI33zzjeCE6o9FKSIiIiIiIiKiF5iamiI+Ph62trYK6+np6XB1dcX9+/cFJdMcWqIDEBERERERERGpmtLSUqSmplZYT01NRXl5uYBEmoczpYiIiIiIiIiIXuDt7Q0fHx9cvXoVnTp1AgCcPHkSoaGh8Pb2FpxOM/D4HhERERERERHRC8rLy7Fo0SIsW7YMOTk5AABzc3MEBgZi0qRJ8jlT9O+xKEVERERERERE9DcePXoEADAyMhKcRLPw+B4RERERERERURXy8vKQnp4OSZJga2sLExMT0ZE0BgedExERERERERG94PHjx/Dx8YG5uTk6d+4Md3d3mJubw9fXF4WFhaLjaQQWpYiIiIiIiIiIXjBx4kTExcVhz549KCgoQEFBAXbt2oW4uDhMmjRJdDyNwJlSREREREREREQvMDExwbZt29C1a1eF9cOHD2Po0KHIy8sTE0yDsFOKiIiIiIiIiOgFhYWFaNSoUYV1MzMzHt97RdgpRURERERERET0gu7du6Nhw4aIioqCnp4eAODJkyfw8vJCfn4+Dh48KDih+mNRioiIiIiIiIjoBRcvXkTv3r1RVFQER0dHSJKEc+fOQU9PD/v370fr1q1FR1R7LEoREREREREREVXiyZMn2LBhA9LS0iCTyWBnZwdPT0/o6+uLjqYRWJQiIiIiIiIiIvrL1KlTMWjQIHTs2FF0FI3HQedERERERERERH/JyclBv379YG5ujk8++QS//PIL/vzzT9GxNBI7pYiIiIiIiIiIniOTyRAfH489e/Zg9+7duHXrFnr27IkBAwagX79+MDExER1RI7AoRURERERERET0N1JTU7Fnzx7s2rULCQkJeOuttzBgwAAMHz4cTZs2FR1PbbEoRURERERERERUTXl5edi9ezd2794Nd3d3TJ48WXQktcWiFBERERERERERKR0HnRMRERERERERPefMmTPw9PSEtbU19PX1YWBgAGtra3h6eiIhIUF0PI3BTikiIiIiIiIior/s3LkTQ4cORffu3dGrVy80atQIMpkMd+/exYEDB3Do0CFER0dj4MCBoqOqPRaliIiIiIiIiIj+0qZNG4wYMQIhISGV7n/99deIiorCpUuXlJxM87AoRURERERERET0Fz09PSQnJ6NVq1aV7qenp8PR0RFFRUVKTqZ5OFOKiIiIiIiIiOgvLVq0wM6dO6vc37VrF5o3b668QBqslugARERERERERESqYvbs2fjwww8RFxeHd955B40aNYIkSbhz5w5+++03HDhwAFu2bBEdUyPw+B4RERERERER0XNOnDiBZcuW4cSJE7hz5w4AoHHjxnBxcUFgYCBcXFwEJ9QMLEoREREREREREZHScaYUEREREREREdE/yM3NlXdN0avBohQRERERERER0V/y8/MxePBgWFpa4rPPPkNZWRn8/Pxgbm6Opk2bwtXVFTk5OaJjagQWpYiIiIiIiIiI/jJ58mRcvnwZU6ZMwaVLl/DBBx/gzJkzOHr0KOLj41FaWoqQkBDRMTUCZ0oREREREREREf2lSZMm2LZtG1xdXZGbmwtzc3Ps378fPXv2BAAcO3YMw4YNw82bNwUnVX/slCIiIiIiIiIi+svDhw/RtGlTAECjRo1Qq1YtmJuby/ebNGmCgoICQek0C4tSRERERERERER/admyJX7++WcAwK+//go9PT0cOHBAvr9//35YW1uLiqdRaokOQERERERERESkKqZMmQIvLy8sXboUN2/exIYNGxAQEIBTp05BS0sLP/30E8LCwkTH1AicKUVERERERERE9Jz4+HicOnUKrq6ucHFxQUpKCkJDQ1FYWIj+/fvDy8tLdESNwKIUEREREREREREpHWdKERERERERERGR0rEoRURERERERET0nF9++QV+fn74/PPPkZaWprD34MEDdOvWTVAyzcKiFBERERERERHRXzZt2oSBAwfizp07OHHiBNq1a4eNGzfK94uLixEXFycwoebg7XtERERERERERH9ZtGgRlixZgvHjxwMAtm3bBm9vbxQVFcHX11dwOs3CohQRERERERER0V8uX76Mfv36yf/5gw8+gImJCQYMGICSkhK89957AtNpFhaliIiIiIiIiIj+YmRkhNzcXFhbW8vXunbtij179qBfv364efOmwHSahTOliIiIiIiIiIj+0rFjR/z6668V1rt06YI9e/Zg6dKlyg+loViUIiIiIiIiIiL6S1BQEPT09Crd69q1K37++WeMGjVKyak0kySTyWSiQxARERERERER0euFM6WIiIiIiIiIiAA8evSo2s8aGRnVYJLXAzuliIiIiIiIiIgAaGlpQZKkaj1bVlZWw2k0HzuliIiIiIiIiIgAHD58WP76+vXrCAkJwejRo+Hi4gIAOHHiBNavX48FCxaIiqhR2ClFRERERERERPSC7t27w8/PD8OHD1dY37RpEyIjIxEbGysmmAZhUYqIiIiIiIiI6AUGBgY4f/48WrZsqbB++fJltG3bFoWFhYKSaQ4t0QGIiIiIiIiIiFSNhYUFIiIiKqyvXLkSFhYWAhJpHs6UIiIiIiIiIiJ6wZIlSzB48GDs378fnTp1AgCcPHkS165dw/bt2wWn0ww8vkdEREREREREVIns7GxEREQgNTUVMpkMdnZ28Pf3Z6fUK8JOKSIiIiIiIiKiShgaGqJBgwZo0KABJElCw4YNYWRkJDqWxmCnFBERERERERHRCxISEtCrVy/o6+ujY8eOkMlkSEhIwJMnT3DgwAE4OTmJjqj2WJQiIiIiIiIiInqBu7s7bGxs8P3336NWracHzUpLS+Hn54eMjAwcOXJEcEL1x6IUEREREREREdEL9PX1kZSUhDfeeENhPSUlBc7OzigsLBSUTHNoiQ5ARERERERERKRqjIyMkJWVVWE9OzsbhoaGAhJpHhaliIiIiIiIiIheMGzYMPj6+mLr1q3Izs7GzZs3sWXLFvj5+WH48OGi42kE3r5HRERERERERPSCRYsWQZIkjBo1CqWlpQAAHR0djBkzBqGhoYLTaQbOlCIiIiIiIiIiqkJhYSGuXbsGmUwGGxsbGBgYiI6kMViUIiIiIiIiIiIipeNMKSIiIiIiIiIiUjoWpYiIiIiIiIiISOlYlCIiIiIiIiIiIqVjUYqIiIiIiIiIiJSORSkiIiIiIiIiIlI6FqWIiIiIiIiIiEjpWJQiIiIiIiIiIiKlY1GKiIiIiIiIiIiU7v8BSPxzfYOPYZoAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.patches import Rectangle\n",
    "\n",
    "# 模型准确率对比\n",
    "plt.figure(figsize=(12, 5))\n",
    "plt.subplot(1, 2, 1)\n",
    "models = ['My RF', 'Sklearn RF', 'Decision Tree']\n",
    "accuracies = [my_rf_acc, sklearn_rf_acc, dt_acc]\n",
    "colors = ['#1f77b4', '#ff7f0e', '#2ca02c']\n",
    "bars = plt.bar(models, accuracies, color=colors)\n",
    "for bar in bars:\n",
    "    height = bar.get_height()\n",
    "    plt.text(bar.get_x() + bar.get_width()/2., height,\n",
    "            f'{height:.3f}', ha='center', va='bottom')\n",
    "plt.title('Model Accuracy Comparison')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.ylim(0, 1.1)\n",
    "\n",
    "# 特征重要性对比\n",
    "plt.subplot(1, 2, 2)\n",
    "x = np.arange(len(feature_names))\n",
    "width = 0.25\n",
    "plt.bar(x - width, my_rf.feature_importances_, width, label='My RF', color='#1f77b4')\n",
    "plt.bar(x, sklearn_rf.feature_importances_, width, label='Sklearn RF', color='#ff7f0e')\n",
    "plt.bar(x + width, dt.feature_importances_, width, label='Decision Tree', color='#2ca02c')\n",
    "plt.xticks(x, feature_names, rotation=90)\n",
    "plt.title('Feature Importance Comparison')\n",
    "plt.legend()\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. 决策树结构可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "ename": "RecursionError",
     "evalue": "maximum recursion depth exceeded",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mRecursionError\u001b[0m                            Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[5], line 35\u001b[0m\n\u001b[0;32m     33\u001b[0m ax\u001b[38;5;241m.\u001b[39maxis(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m     34\u001b[0m first_tree \u001b[38;5;241m=\u001b[39m my_rf\u001b[38;5;241m.\u001b[39mtrees[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m---> 35\u001b[0m plot_tree_simple(first_tree, np\u001b[38;5;241m.\u001b[39marray(feature_names)[my_rf\u001b[38;5;241m.\u001b[39mtrees[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m1\u001b[39m]], class_names, ax)\n\u001b[0;32m     36\u001b[0m plt\u001b[38;5;241m.\u001b[39mshow()\n",
      "Cell \u001b[1;32mIn[5], line 29\u001b[0m, in \u001b[0;36mplot_tree_simple\u001b[1;34m(tree, feature_names, class_names, ax, x, y, width, height)\u001b[0m\n\u001b[0;32m     24\u001b[0m ax\u001b[38;5;241m.\u001b[39mannotate(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, xy\u001b[38;5;241m=\u001b[39m(left_x, new_y), xytext\u001b[38;5;241m=\u001b[39m(x, y), \n\u001b[0;32m     25\u001b[0m             arrowprops\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(arrowstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m->\u001b[39m\u001b[38;5;124m\"\u001b[39m, lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1.5\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m     26\u001b[0m ax\u001b[38;5;241m.\u001b[39mannotate(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, xy\u001b[38;5;241m=\u001b[39m(right_x, new_y), xytext\u001b[38;5;241m=\u001b[39m(x, y), \n\u001b[0;32m     27\u001b[0m             arrowprops\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(arrowstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m->\u001b[39m\u001b[38;5;124m\"\u001b[39m, lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1.5\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[1;32m---> 29\u001b[0m plot_tree_simple(tree, feature_names, class_names, ax, left_x, new_y, width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m, height)\n\u001b[0;32m     30\u001b[0m plot_tree_simple(tree, feature_names, class_names, ax, right_x, new_y, width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m, height)\n",
      "Cell \u001b[1;32mIn[5], line 29\u001b[0m, in \u001b[0;36mplot_tree_simple\u001b[1;34m(tree, feature_names, class_names, ax, x, y, width, height)\u001b[0m\n\u001b[0;32m     24\u001b[0m ax\u001b[38;5;241m.\u001b[39mannotate(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, xy\u001b[38;5;241m=\u001b[39m(left_x, new_y), xytext\u001b[38;5;241m=\u001b[39m(x, y), \n\u001b[0;32m     25\u001b[0m             arrowprops\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(arrowstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m->\u001b[39m\u001b[38;5;124m\"\u001b[39m, lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1.5\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m     26\u001b[0m ax\u001b[38;5;241m.\u001b[39mannotate(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, xy\u001b[38;5;241m=\u001b[39m(right_x, new_y), xytext\u001b[38;5;241m=\u001b[39m(x, y), \n\u001b[0;32m     27\u001b[0m             arrowprops\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(arrowstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m->\u001b[39m\u001b[38;5;124m\"\u001b[39m, lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1.5\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[1;32m---> 29\u001b[0m plot_tree_simple(tree, feature_names, class_names, ax, left_x, new_y, width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m, height)\n\u001b[0;32m     30\u001b[0m plot_tree_simple(tree, feature_names, class_names, ax, right_x, new_y, width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m, height)\n",
      "    \u001b[1;31m[... skipping similar frames: plot_tree_simple at line 29 (2961 times)]\u001b[0m\n",
      "Cell \u001b[1;32mIn[5], line 29\u001b[0m, in \u001b[0;36mplot_tree_simple\u001b[1;34m(tree, feature_names, class_names, ax, x, y, width, height)\u001b[0m\n\u001b[0;32m     24\u001b[0m ax\u001b[38;5;241m.\u001b[39mannotate(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, xy\u001b[38;5;241m=\u001b[39m(left_x, new_y), xytext\u001b[38;5;241m=\u001b[39m(x, y), \n\u001b[0;32m     25\u001b[0m             arrowprops\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(arrowstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m->\u001b[39m\u001b[38;5;124m\"\u001b[39m, lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1.5\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m     26\u001b[0m ax\u001b[38;5;241m.\u001b[39mannotate(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m, xy\u001b[38;5;241m=\u001b[39m(right_x, new_y), xytext\u001b[38;5;241m=\u001b[39m(x, y), \n\u001b[0;32m     27\u001b[0m             arrowprops\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(arrowstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m->\u001b[39m\u001b[38;5;124m\"\u001b[39m, lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1.5\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[1;32m---> 29\u001b[0m plot_tree_simple(tree, feature_names, class_names, ax, left_x, new_y, width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m, height)\n\u001b[0;32m     30\u001b[0m plot_tree_simple(tree, feature_names, class_names, ax, right_x, new_y, width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m, height)\n",
      "Cell \u001b[1;32mIn[5], line 16\u001b[0m, in \u001b[0;36mplot_tree_simple\u001b[1;34m(tree, feature_names, class_names, ax, x, y, width, height)\u001b[0m\n\u001b[0;32m     14\u001b[0m threshold \u001b[38;5;241m=\u001b[39m tree\u001b[38;5;241m.\u001b[39mtree_\u001b[38;5;241m.\u001b[39mthreshold[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m     15\u001b[0m ax\u001b[38;5;241m.\u001b[39madd_patch(Rectangle((x\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m0.05\u001b[39m, y\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m0.02\u001b[39m), \u001b[38;5;241m0.1\u001b[39m, \u001b[38;5;241m0.04\u001b[39m, color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mskyblue\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[1;32m---> 16\u001b[0m ax\u001b[38;5;241m.\u001b[39mtext(x, y, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfeature\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m <= \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mthreshold\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.2f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mSamples: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtree\u001b[38;5;241m.\u001b[39mtree_\u001b[38;5;241m.\u001b[39mn_node_samples[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, \n\u001b[0;32m     17\u001b[0m         ha\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcenter\u001b[39m\u001b[38;5;124m'\u001b[39m, va\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcenter\u001b[39m\u001b[38;5;124m'\u001b[39m, bbox\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(facecolor\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwhite\u001b[39m\u001b[38;5;124m'\u001b[39m, alpha\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.8\u001b[39m))\n\u001b[0;32m     19\u001b[0m \u001b[38;5;66;03m# 绘制左右子树\u001b[39;00m\n\u001b[0;32m     20\u001b[0m left_x \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m-\u001b[39m width\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\axes\\_axes.py:743\u001b[0m, in \u001b[0;36mAxes.text\u001b[1;34m(self, x, y, s, fontdict, **kwargs)\u001b[0m\n\u001b[0;32m    672\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m    673\u001b[0m \u001b[38;5;124;03mAdd text to the Axes.\u001b[39;00m\n\u001b[0;32m    674\u001b[0m \n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    733\u001b[0m \u001b[38;5;124;03m    >>> text(x, y, s, bbox=dict(facecolor='red', alpha=0.5))\u001b[39;00m\n\u001b[0;32m    734\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m    735\u001b[0m effective_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m    736\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mverticalalignment\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbaseline\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m    737\u001b[0m     \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhorizontalalignment\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    741\u001b[0m     \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m    742\u001b[0m }\n\u001b[1;32m--> 743\u001b[0m t \u001b[38;5;241m=\u001b[39m mtext\u001b[38;5;241m.\u001b[39mText(x, y, text\u001b[38;5;241m=\u001b[39ms, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39meffective_kwargs)\n\u001b[0;32m    744\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m t\u001b[38;5;241m.\u001b[39mget_clip_path() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m    745\u001b[0m     t\u001b[38;5;241m.\u001b[39mset_clip_path(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch)\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\text.py:155\u001b[0m, in \u001b[0;36mText.__init__\u001b[1;34m(self, x, y, text, color, verticalalignment, horizontalalignment, multialignment, fontproperties, rotation, linespacing, rotation_mode, usetex, wrap, transform_rotates_text, parse_math, antialiased, **kwargs)\u001b[0m\n\u001b[0;32m    138\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_text \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m    139\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset_visual_defaults(\n\u001b[0;32m    140\u001b[0m     text\u001b[38;5;241m=\u001b[39mtext,\n\u001b[0;32m    141\u001b[0m     color\u001b[38;5;241m=\u001b[39mcolor,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    153\u001b[0m     antialiased\u001b[38;5;241m=\u001b[39mantialiased\n\u001b[0;32m    154\u001b[0m )\n\u001b[1;32m--> 155\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mupdate(kwargs)\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\text.py:207\u001b[0m, in \u001b[0;36mText.update\u001b[1;34m(self, kwargs)\u001b[0m\n\u001b[0;32m    205\u001b[0m ret\u001b[38;5;241m.\u001b[39mextend(\u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mupdate(kwargs))\n\u001b[0;32m    206\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m sentinel:\n\u001b[1;32m--> 207\u001b[0m     ret\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_bbox(bbox))\n\u001b[0;32m    208\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ret\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\text.py:541\u001b[0m, in \u001b[0;36mText.set_bbox\u001b[1;34m(self, rectprops)\u001b[0m\n\u001b[0;32m    539\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(boxstyle, \u001b[38;5;28mstr\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpad\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m boxstyle:\n\u001b[0;32m    540\u001b[0m         boxstyle \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m,pad=\u001b[39m\u001b[38;5;132;01m%0.2f\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m pad\n\u001b[1;32m--> 541\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bbox_patch \u001b[38;5;241m=\u001b[39m FancyBboxPatch(\n\u001b[0;32m    542\u001b[0m         (\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m), \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m,\n\u001b[0;32m    543\u001b[0m         boxstyle\u001b[38;5;241m=\u001b[39mboxstyle, transform\u001b[38;5;241m=\u001b[39mIdentityTransform(), \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mprops)\n\u001b[0;32m    544\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    545\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bbox_patch \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\patches.py:3932\u001b[0m, in \u001b[0;36mFancyBboxPatch.__init__\u001b[1;34m(self, xy, width, height, boxstyle, mutation_scale, mutation_aspect, **kwargs)\u001b[0m\n\u001b[0;32m   3889\u001b[0m \u001b[38;5;129m@_docstring\u001b[39m\u001b[38;5;241m.\u001b[39mdedent_interpd\n\u001b[0;32m   3890\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, xy, width, height, boxstyle\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mround\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m*\u001b[39m,\n\u001b[0;32m   3891\u001b[0m              mutation_scale\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, mutation_aspect\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m   3892\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m   3893\u001b[0m \u001b[38;5;124;03m    Parameters\u001b[39;00m\n\u001b[0;32m   3894\u001b[0m \u001b[38;5;124;03m    ----------\u001b[39;00m\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m   3929\u001b[0m \u001b[38;5;124;03m    %(Patch:kwdoc)s\u001b[39;00m\n\u001b[0;32m   3930\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[1;32m-> 3932\u001b[0m     \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m   3933\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_x, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_y \u001b[38;5;241m=\u001b[39m xy\n\u001b[0;32m   3934\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_width \u001b[38;5;241m=\u001b[39m width\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\patches.py:98\u001b[0m, in \u001b[0;36mPatch.__init__\u001b[1;34m(self, edgecolor, facecolor, color, linewidth, linestyle, antialiased, hatch, fill, capstyle, joinstyle, **kwargs)\u001b[0m\n\u001b[0;32m     95\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_joinstyle(joinstyle)\n\u001b[0;32m     97\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(kwargs):\n\u001b[1;32m---> 98\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_internal_update(kwargs)\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\artist.py:1216\u001b[0m, in \u001b[0;36mArtist._internal_update\u001b[1;34m(self, kwargs)\u001b[0m\n\u001b[0;32m   1209\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_internal_update\u001b[39m(\u001b[38;5;28mself\u001b[39m, kwargs):\n\u001b[0;32m   1210\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m   1211\u001b[0m \u001b[38;5;124;03m    Update artist properties without prenormalizing them, but generating\u001b[39;00m\n\u001b[0;32m   1212\u001b[0m \u001b[38;5;124;03m    errors as if calling `set`.\u001b[39;00m\n\u001b[0;32m   1213\u001b[0m \n\u001b[0;32m   1214\u001b[0m \u001b[38;5;124;03m    The lack of prenormalization is to maintain backcompatibility.\u001b[39;00m\n\u001b[0;32m   1215\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[1;32m-> 1216\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_props(\n\u001b[0;32m   1217\u001b[0m         kwargs, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{cls.__name__}\u001b[39;00m\u001b[38;5;124m.set() got an unexpected keyword argument \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m   1218\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{prop_name!r}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\artist.py:1192\u001b[0m, in \u001b[0;36mArtist._update_props\u001b[1;34m(self, props, errfmt)\u001b[0m\n\u001b[0;32m   1189\u001b[0m             \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(func):\n\u001b[0;32m   1190\u001b[0m                 \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\n\u001b[0;32m   1191\u001b[0m                     errfmt\u001b[38;5;241m.\u001b[39mformat(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m), prop_name\u001b[38;5;241m=\u001b[39mk))\n\u001b[1;32m-> 1192\u001b[0m             ret\u001b[38;5;241m.\u001b[39mappend(func(v))\n\u001b[0;32m   1193\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ret:\n\u001b[0;32m   1194\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpchanged()\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\patches.py:423\u001b[0m, in \u001b[0;36mPatch.set_alpha\u001b[1;34m(self, alpha)\u001b[0m\n\u001b[0;32m    421\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mset_alpha\u001b[39m(\u001b[38;5;28mself\u001b[39m, alpha):\n\u001b[0;32m    422\u001b[0m     \u001b[38;5;66;03m# docstring inherited\u001b[39;00m\n\u001b[1;32m--> 423\u001b[0m     \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mset_alpha(alpha)\n\u001b[0;32m    424\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_set_facecolor(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_original_facecolor)\n\u001b[0;32m    425\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_set_edgecolor(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_original_edgecolor)\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\artist.py:1014\u001b[0m, in \u001b[0;36mArtist.set_alpha\u001b[1;34m(self, alpha)\u001b[0m\n\u001b[0;32m   1012\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m alpha \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_alpha:\n\u001b[0;32m   1013\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_alpha \u001b[38;5;241m=\u001b[39m alpha\n\u001b[1;32m-> 1014\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpchanged()\n\u001b[0;32m   1015\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\artist.py:426\u001b[0m, in \u001b[0;36mArtist.pchanged\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    415\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpchanged\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m    416\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m    417\u001b[0m \u001b[38;5;124;03m    Call all of the registered callbacks.\u001b[39;00m\n\u001b[0;32m    418\u001b[0m \n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    424\u001b[0m \u001b[38;5;124;03m    remove_callback\u001b[39;00m\n\u001b[0;32m    425\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[1;32m--> 426\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_callbacks\u001b[38;5;241m.\u001b[39mprocess(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpchanged\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "File \u001b[1;32mc:\\ProgramData\\anaconda3\\Lib\\site-packages\\matplotlib\\cbook.py:293\u001b[0m, in \u001b[0;36mCallbackRegistry.process\u001b[1;34m(self, s, *args, **kwargs)\u001b[0m\n\u001b[0;32m    286\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m    287\u001b[0m \u001b[38;5;124;03mProcess signal *s*.\u001b[39;00m\n\u001b[0;32m    288\u001b[0m \n\u001b[0;32m    289\u001b[0m \u001b[38;5;124;03mAll of the functions registered to receive callbacks on *s* will be\u001b[39;00m\n\u001b[0;32m    290\u001b[0m \u001b[38;5;124;03mcalled with ``*args`` and ``**kwargs``.\u001b[39;00m\n\u001b[0;32m    291\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m    292\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_signals \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 293\u001b[0m     _api\u001b[38;5;241m.\u001b[39mcheck_in_list(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_signals, signal\u001b[38;5;241m=\u001b[39ms)\n\u001b[0;32m    294\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ref \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcallbacks\u001b[38;5;241m.\u001b[39mget(s, {})\u001b[38;5;241m.\u001b[39mvalues()):\n\u001b[0;32m    295\u001b[0m     func \u001b[38;5;241m=\u001b[39m ref()\n",
      "\u001b[1;31mRecursionError\u001b[0m: maximum recursion depth exceeded"
     ]
    }
   ],
   "source": [
    "# 展示随机森林中第一棵决策树的结构\n",
    "plt.figure(figsize=(20, 10))\n",
    "plt.title(\"First Tree in My Random Forest\", fontsize=16)\n",
    "\n",
    "def plot_tree_simple(tree, feature_names, class_names, ax, x=0.5, y=0.9, width=0.4, height=0.1):\n",
    "    if tree.tree_.children_left[0] == -1:  # 叶节点\n",
    "        value = tree.tree_.value[0]\n",
    "        class_idx = np.argmax(value)\n",
    "        ax.add_patch(Rectangle((x-0.05, y-0.02), 0.1, 0.04, color='lightgreen'))\n",
    "        ax.text(x, y, f\"Class: {class_names[class_idx]}\\nSamples: {tree.tree_.n_node_samples[0]}\", \n",
    "                ha='center', va='center', bbox=dict(facecolor='white', alpha=0.8))\n",
    "    else:  # 决策节点\n",
    "        feature = feature_names[tree.tree_.feature[0]]\n",
    "        threshold = tree.tree_.threshold[0]\n",
    "        ax.add_patch(Rectangle((x-0.05, y-0.02), 0.1, 0.04, color='skyblue'))\n",
    "        ax.text(x, y, f\"{feature} <= {threshold:.2f}\\nSamples: {tree.tree_.n_node_samples[0]}\", \n",
    "                ha='center', va='center', bbox=dict(facecolor='white', alpha=0.8))\n",
    "        \n",
    "        # 绘制左右子树\n",
    "        left_x = x - width/2\n",
    "        right_x = x + width/2\n",
    "        new_y = y - height\n",
    "        \n",
    "        ax.annotate(\"\", xy=(left_x, new_y), xytext=(x, y), \n",
    "                    arrowprops=dict(arrowstyle=\"->\", lw=1.5, color='gray'))\n",
    "        ax.annotate(\"\", xy=(right_x, new_y), xytext=(x, y), \n",
    "                    arrowprops=dict(arrowstyle=\"->\", lw=1.5, color='gray'))\n",
    "        \n",
    "        plot_tree_simple(tree, feature_names, class_names, ax, left_x, new_y, width/2, height)\n",
    "        plot_tree_simple(tree, feature_names, class_names, ax, right_x, new_y, width/2, height)\n",
    "\n",
    "ax = plt.gca()\n",
    "ax.axis('off')\n",
    "first_tree = my_rf.trees[0][0]\n",
    "plot_tree_simple(first_tree, np.array(feature_names)[my_rf.trees[0][1]], class_names, ax)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. 实验结果分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 性能对比\n",
    "\n",
    "| 模型 | 准确率 |\n",
    "|------|--------|\n",
    "| 自主实现随机森林 | 0.944 |\n",
    "| Sklearn随机森林 | 0.981 |\n",
    "| 单棵决策树 | 0.889 |\n",
    "\n",
    "### 主要发现\n",
    "1. **随机森林优于单棵决策树**：两种随机森林实现都比单棵决策树表现更好，验证了集成学习的优势\n",
    "2. **Sklearn实现更优**：自主实现的随机森林准确率略低于Sklearn版本，可能原因包括：\n",
    "   - 特征采样策略差异\n",
    "   - 决策树实现细节不同\n",
    "   - 随机性控制差异\n",
    "3. **特征重要性一致**：三种模型对重要特征的识别基本一致，proline和flavanoids是最重要特征"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 8. 结论\n",
    "\n",
    "1. 随机森林通过集成多棵决策树显著提高了模型性能\n",
    "2. 自主实现的随机森林验证了算法原理，但性能略逊于优化后的Sklearn实现\n",
    "3. 可视化分析有助于理解模型决策过程和特征重要性\n",
    "4. 未来可尝试调整参数(n_estimators, max_depth等)进一步优化模型"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
